/*
 * C/C++ KLIB Project
 * 
 * Copyright (c) 2012 Ken Zhang (cpp.china@gmail.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA  02111-1307  USA
 *
 */

#include <string.h>
#include "klib.h"

int strrcp(char *dest, size_t size, const char *src, const char *tofind, const char *replacement)
{
	int len1;
	int len2;
	int n = 0, ncp = 0;
	const char *p;

	if (size == 0 || dest == NULL || src == NULL || tofind == NULL || replacement == NULL)
		return -1;
	
	len1 = strlen(tofind);
	len2 = strlen(replacement);

	p = src;
	while (p = strstr(src, tofind)) {
		if (size - ncp - 1 > p - src) {
			memcpy(dest + ncp, src, p - src);
			ncp += (p - src);
		}
		else {
			memcpy(dest + ncp, src, size - ncp - 1);
			ncp += size - ncp - 1;
			dest[ncp] = '\0';
			return n;
		}

		if (size - ncp - 1 > len2) {
			memcpy(dest + ncp, replacement, len2);
			ncp += len2;
		}
		else {
			memcpy(dest + ncp, replacement, size - ncp - 1);
			ncp += size - ncp - 1;
			dest[ncp] = '\0';
			return n;
		}

		src = p + len1;
		++n;
	}

	ncp += strncopy(dest + ncp, src, size - ncp - 1);
	dest[ncp] = '\0';

	return n;
}
